home *** CD-ROM | disk | FTP | other *** search
Text File | 1987-02-27 | 4.4 KB | 294 lines | [TEXT/MACA] |
- /* GREP.C a generalized regualr expression parser. */
-
- #include "stdio.h"
- #include "argsim.h"
- #include "tools.h"
-
- #define MAXLINE 128
- #define MAX_EXPR 64
-
- int vflag, yflag, cflag, lflag, nflag, hflag, fflag ;
-
- main(argc, argv)
- int argc ;
- char **argv ;
- {
- int i, j, linenum, count ;
- int line[MAXLINE] ;
- int numfiles ;
- FILE *stream ;
- int exprc ;
- TOKEN *exprv[MAX_EXPR] ;
-
- #ifdef DEBUG
- fprintf(stderr, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ;
- #endif
- i = 1 ;
- if(argc<2)
- abort(pr_usage(1)) ;
- if(*argv[i] == '-')
- {
- expand_sw(argv[i++]) ;
- if(i == argc)
- abort(pr_usage(1)) ;
- }
- if((exprc = get_expr(exprv, MAX_EXPR, &argv[i++])) == 0)
- abort (pr_usage(2)) ;
- numfiles = argc - 1 ;
- do
- {
- if(numfiles)
- {
- stream = fopen(argv[i], "r") ;
- if(stream == NULL)
- {
- fprintf(stderr, "Can't open %s\n", argv[i]) ;
- getchar() ;
- continue ;
- }
- }
- else
- {
- stream = stdin ;
- }
- count = 0 ;
- linenum = 1 ;
- while (fgets(line, MAXLINE, stream))
- {
- #ifdef CPM
- if(!fflag || yflag)
- stoupper(line) ;
- #else
- if(yflag)
- stoupper(line) ;
- #endif
- for(j=exprc; --j >= 0; )
- {
- if(matchs(line, exprv[j]))
- {
- count++ ;
- pr_match(linenum, line, argv[i], 1, numfiles) ;
- }
- else
- {
- pr_match(linenum, line, argv[i], 0, numfiles) ;
- }
- linenum++ ;
- cntrl_c() ;
- }
- if(lflag && count)
- break ;
- }
- pr_count(numfiles, argv[i], count) ;
- fclose(stream) ;
- } while(++i < argc) ;
- OSreset() ;
- abort() ;
- }
-
-
-
-
-
- pr_count (fcount, fname, count)
- int fcount, count ;
- char *fname ;
- {
- #ifdef DEBUG
- fprintf(stderr, "pr_count entered.\n") ;
- #endif
- if(!cflag)
- return ;
- if(fcount > 1)
- printf("%-12s: ", fname) ;
- printf("%d\n", count) ;
- }
-
-
-
-
- pr_match (linenum, line, fname, match, numfiles)
- int linenum, match, numfiles ;
- char *line, *fname ;
- {
- char buf[80] ;
- #ifdef DEBUG
- fprintf(stderr, "pr_match entered.\n") ;
- #endif
- if(cflag)
- return ;
- if((vflag && !match) || (!vflag && match))
- {
- if(!hflag && ((numfiles > 1) || lflag))
- printf("%s%s", fname, lflag ? "\n" : ":") ;
- if(nflag)
- printf("%03d:", linenum) ;
- if(!lflag)
- printf("%s", line) ;
- }
- }
-
-
-
-
- pr_usage (num)
- int num ;
- {
- #ifdef DEBUG
- fprintf(stderr, "%d ", num) ;
- #endif
- fprintf(stderr, "usage: grep [-cefhlnvy] [expression] ,<files...>\n") ;
- }
-
-
-
-
- abort ()
- {
- exit() ;
- }
-
-
-
-
- expand_sw (str)
- char *str ;
- {
- vflag = 0;
- cflag = 0 ;
- lflag = 0 ;
- nflag = 0 ;
- hflag = 0 ;
- fflag = 0 ;
- yflag = 0 ;
- #ifdef DEBUG
- fprintf(stderr, "expand_sw entered.\n") ;
- #endif
- while(*str)
- {
- switch(toupper(*str))
- {
- case '-':
- case 'E': break ;
- case 'C': cflag = 1 ; break ;
- case 'F': fflag = 1 ; break ;
- case 'H': hflag = 1 ; break ;
- case 'L': lflag = 1 ; break ;
- case 'N': nflag = 1 ; break ;
- case 'V': vflag = 1 ; break ;
- case 'Y': yflag = 1 ; break ;
- defalut: pr_usage(3) ;
- abort() ;
- break ;
- }
- str++ ;
- }
- }
-
-
-
-
- int do_or (lp, expr, max)
- char *lp ;
- TOKEN **expr ;
- int max ;
- {
- int found ;
- TOKEN *pat ;
- char *op ;
- #ifdef DEBUG
- fprintf(stderr, "do_or entered.\n") ;
- #endif
-
- found = 0 ;
- if(yflag)
- stoupper(lp) ;
- while (op = in_string(OR_SYM, lp))
- {
- if(found <= max && (pat = makepat(lp, OR_SYM)))
- {
- *expr++ = pat ;
- found++ ;
- }
- lp = ++op ;
- if(pat == 0)
- goto fatal_err ;
- }
- if(found <= max && (pat = makepat(lp, OR_SYM)))
- {
- found++ ;
- *expr = pat ;
- }
- if(pat == 0)
- {
- fatal_err:
- printf("Illegal expression\n") ;
- exit() ;
- }
- return(found) ;
- }
-
-
-
-
- get_expr (expr, max, defexpr)
- TOKEN *expr[] ;
- int max ;
- char **defexpr ;
- {
- FILE *stream ;
- int count ;
- char line[MAXLINE] ;
- #ifdef DEBUG
- int i ;
- fprintf(stderr, "get_expr entered.\n") ;
- #endif
- count = 0 ;
- if(fflag)
- {
- #ifdef DEBUG
- fprintf(stderr, "fflag true in get_expr\n") ;
- #endif
- if((stream = fopen(*defexpr, "r")) == NULL)
- {
- fprintf(stderr, "Can't open %s\n", *defexpr) ;
- abort() ;
- }
- while((max - count) && fgets(line, MAXLINE, stream))
- {
- count += do_or(line, &expr[count], max - count) ;
- #ifdef DEBUG
- fprintf(stderr, "Count = %d\n", count) ;
- #endif
- }
- fclose(stream) ;
- }
- else
- {
- if(count += do_or(*defexpr, &expr[count], max - count))
- *defexpr = " " ;
- }
- #ifdef DEBUG
- for(i=count; --i >= 0; )
- {
- pr_tok(expr[i]) ;
- printf("----------------------------------------------\n") ;
- }
- #endif
- return(count) ;
- }
-
-
-
-
- cntrl_c()
- {
- #ifdef CPM
- if(bdos(11) && ((bdos(1,0) & ox7f) == 0x03))
- abort() ;
- #endif
- #ifdef DEBUG
- fprintf(stderr, "cntrl_c entered.\n") ;
- #endif
- }